<?
final class helper_mongo_database
{
	public $_DB;
	public $_COLLECTION;

	function __construct( &$sDatabase )
	{
		$this->_DB = &$sDatabase;

		return $this->_DB;
	}
    
	/**
	 * @brief class
	 * @date 2012-07-03
     * @param $sCollection  |   string          |   컬렉션이름
     * @param $aOption      |   array           |   mongoCursor 하위에 규칙을 가진다 php.net 참조
     * @return $return      |   array|string    |   결과값을 array 와 string 으로 저장한다.   
	 **/
    public function find($sCollection, $aOption=array())
    {
        if(is_null($aOption['where'])){
            $oData = $this->_DB->selectCollection($sCollection)->find();
        }else{
            $oData = $this->_DB->selectCollection($sCollection)->find($aOption['where']);
        }
        $aOption['fields']['_id'] = 0;
        foreach($aOption as $key => $val){
            if($key != "where"){
                $oData = $oData->$key($val);
            }
        }

        $return = is_object($oData) ? iterator_to_array($oData) : $oData;
        $return = count($return) > 1 ? $return : $return[0];
        return $return;
    }

    /**
	 * @brief class
	 * @date 2012-07-03
     * @param $sCollection  |   string          |   컬렉션이름
     * @param $aOption      |   array           |   mongoCursor 하위에 규칙을 가진다 php.net 참조
     * @return $return      |   array|string    |   결과값을 array 와 string 으로 저장한다.   
	 **/
    public function save($sCollection, &$aSaveData)
    {
        $bResult = $this->_DB->selectCollection($sCollection)->save($aSaveData);
        return $bResult;
    }

    /**
	 * @brief class
	 * @date 2012-07-03
     * @param $sCollection  |   string          |   컬렉션이름
     * @return $return      |   array|string    |   결과값을 array 와 string 으로 저장한다.   
	 **/
    public function insert($sCollection, &$aSaveData)
    {
        $this->_DB->selectCollection($sCollection)->insert($aSaveData);
    }

    /**
	 * @brief class
	 * @date 2012-07-03
     * @param $sCollection  |   string          |   컬렉션이름
     * @return $return      |   array|string    |   결과값을 array 와 string 으로 저장한다.   
	 **/
    public function update($sCollection, &$aUpateData, $aCriteria)
    {
        $this->_DB->selectCollection($sCollection)->update($aCriteria, $aUpateData);
    }

    /**
	 * @brief class
	 * @date 2012-07-03
     * @param $sCollection  |   string          |   컬렉션이름
     * @return $return      |   array|string    |   결과값을 array 와 string 으로 저장한다.   
	 **/
    public function remove($sCollection, &$aUpateData)
    {
        $this->_DB->selectCollection($sCollection)->remove($aCriteria);
    }
}

/// @brief MongoDB helper class
/// @author ggugi
/// @date 2012-07-03
/// @params 
/// @return 
final class helper_mongo
{
    public $_MONGO;
    public $_DATABASES;

	function __construct() {
		$this->_DATABASES = array();
	}

	function __get($key) {
		if ( gettype($key) == "string" ) {
			$firstChar = substr($key, 0, 1);

			if ( $firstChar === strtoupper( $firstChar ) ) {

				if ( ! isset($this->_DATABASES[$key]) ) {
					$database = $this->_MONGO->selectDB($key);
					$instance = new helper_mongo_database( $database );
					$this->_DATABASES[$key] = &$instance;	
				}

				return $this->_DATABASES[$key];
			}
		}

		return $this->$key;
	}

	/**
	 * @brief class
	 * @date 2012-07-13
     * @param $aMongoConfigInfo |   array   |   DB 설정 정보를 가진다.
	 **/
    public function doConnect($aMongoConfigInfo) {
		$this->_MONGO = new Mongo($aMongoConfigInfo['host']);
    }
}
